视图控制器的弱属性未设置一段时间



我正在使用MMDrawerController,并希望将数据从一个视图控制器传递到另一个视图控制器(HomeViewController to DetailViewController)

首页视图控制器视图控制器

Category *categoryItem = [category objectAtIndex:cellIndex];
         UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
        DetailsViewController * centerVC=(DetailsViewController*)[storyboard instantiateViewControllerWithIdentifier:@"DetailsViewController"];
                    centerVC.catName= categoryItem.name ;
            centerVC.catUrl=categoryItem.url;
            UINavigationController * centerNav=[[UINavigationController alloc]initWithRootViewController:centerVC];
            AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
            appDelegate.drawerController.centerViewController=centerNav;

在ViewDidLoad中,我们希望访问属性作为详细信息视图控制器视图控制器DetailsViewController.h

@property (nonatomic,weak) NSString* catName;
@property (nonatomic,weak) NSString* catUrl;
- (void)viewDidLoad {
    [super viewDidLoad];
self.navigationItem.title = [_catName uppercaseString];
}

但有些时候_catName的价值为零。

有什么问题吗,如果那么请建议。

如果定义属性弱的问题,那么我为视图控制器属性选择哪种类型的属性。

weak说"只要别人强烈指出它,就保持这个"。因此,您的属性 catName 和 catUrl 将仅持续到 categoryItem 在内存中。

相反,您可以使用 copy .

@property (nonatomic, copy) NSString* catName;
@property (nonatomic, copy) NSString* catUrl;

副本保证您拥有的字符串不会更改。假设您想避免传递可变字符串然后在您不知情的情况下更改它。

例如

NSMutableString *someRandomString = [NSMutableString stringWithString:@"stackoverflow"];
Entrepreneur * entrepreneur = [[Entrepreneur alloc] init];
entrepreneur.name = someRandomString;
[someRandomString setString:@"Steve Jobs"];

现在,Entrepreneur 类的 name 属性的值将取决于该属性是声明为 strong 还是copy;如果属性声明为 strong,则为 @"Steve Jobs",如果属性声明为 copy,则为 @"stackoverflow"。

当您从 appdelegate 传递数据时,将您的属性作为强有力的参考。 这也将对您有所帮助。

@property (nonatomic,strong) NSString* catUrl;
@property (nonatomic,strong) NSString* catName;

Objective-C 中的强弱差异

当然,问题出在NSString属性较弱。您应该对 NSString catName 和 NSString catURL 有很强的引用,因为它们必须在内存中。在你的情况下,catName 和 catUrl 在方法(它们已经设置的地方)完成后消失了。

但是你应该设置一个复制属性参数,因为 NSString (更多关于这个的信息在这里 https://stackoverflow.com/a/31217735/5151981)

所以你的代码应该看起来像这样:

@property (nonatomic, copy) NSString *catName;
@property (nonatomic, copy) NSString *catURLString;

请使用非原子并保留

@property (nonatomic, retain) NSString* catUrl;
@property (nonatomic, retain) NSString* catName;

最新更新