有人能详细解释给我时,我必须使用各个属性:nonatomic
,copy
,strong
,weak
,等,为申报财产,并解释每个做什么?某种例子也会很棒.我正在使用ARC.
Objective-C 2.0中的属性是否需要声明相应的实例变量?例如,我习惯做这样的事情:
MyObject.h
@interface MyObject : NSObject {
NSString *name;
}
@property (nonatomic, retain) NSString *name;
@end
Run Code Online (Sandbox Code Playgroud)
MyObject.m
@implementation
@synthesize name;
@end
Run Code Online (Sandbox Code Playgroud)
但是,如果我这样做了:
MyObject.h
@interface MyObject : NSObject {
}
@property (nonatomic, retain) NSString *name;
@end
Run Code Online (Sandbox Code Playgroud)
这仍然有效吗?它与我之前的例子有什么不同吗?
不使用ARC进行编译时,建议使用copy
数据类型的属性,例如NSString
.我找不到有关copy
ARC模式使用的适当文档.有人可以告诉我什么适用于ARC?
cocoa-touch objective-c automatic-ref-counting declared-property
我知道我不能用这个:
myView.frame.origin.x = 25.0;
Run Code Online (Sandbox Code Playgroud)
而我必须使用它:
CGRect myFrame = myView.frame;
myFrame.origin.x = 25.0;
myView.frame = myFrame;
Run Code Online (Sandbox Code Playgroud)
而且我一直这样做,但我不知道为什么我必须这样做.我想在我的理解中填补这个空白.谁能解释一下?
如今Xcode为您提供"表达式不可分配".前一段时间你得到一个编译错误"Lvalue需要作为赋值的左操作数".
根据官方的一些话题,Objective-C中的一个类只应在其标题中公开公共方法和属性:
@interface MyClass : NSObject
@property (nonatomic, strong) MyPublicObject *publicObject;
- (void)publicMethod;
@end
Run Code Online (Sandbox Code Playgroud)
和私有方法/属性应保存在.m文件的类扩展中:
@interface MyClass()
@property (nonatomic, strong) MyPrivateObject *privateObject;
- (void) privateMethod;
@end
Run Code Online (Sandbox Code Playgroud)
并且我认为没有protected
类型的私有但可以从子类访问.我想知道,除了公开宣布私有财产/方法之外,还有什么可以做到这一点吗?
inheritance visibility subclass objective-c declared-property
我知道对象属性的字符串名称.我将如何使用字符串获取和设置该属性?
我需要一种方法来传递属性并获取分配给它的名称.有什么建议?
@property (nonatomic, retain) MyObject *crazyObject;
NSString *str = SOME_WAY_TO_GET_PROPERTY_NAME(crazyObject);
// Above method should return @"crazyObject"
Run Code Online (Sandbox Code Playgroud) introspection objective-c objective-c-runtime declared-property
我注意到Apple的一些示例包括属性上的a retain
和readonly
修饰符.retain
如果在我们使用readonly
修饰符时没有生成setter ,那么包括什么呢?
示例:@property (retain, readonly) NSString *title;
来自AnimatedTableView示例.
我在一些外国代码中读过一些东西,我想检查一下我的假设:
@synchronized(self)
用于self
在设置属性时删除前缀.
所以在我下面的例子中,我正在设置strText
实例,而不仅仅是局部变量,对吧?
- (void)myfunction{
NSString * strText = @"var in function";
@synchronized(self)
{
strText = @"var class (self.strText)";
}
}
Run Code Online (Sandbox Code Playgroud) 在Objective-C中,最佳做法是:
在.h中声明诸如按钮之类的对象,然后在.m中进行合成
.h
@interface SomeViewController : UIViewController
@property (strong, nonatomic) UIButton *someButton;
@end
.m
@implementation SomeViewController
@synthesize someButton = _someButton;
@end
Run Code Online (Sandbox Code Playgroud)或者在.m中将它们声明为ivars
@interface SomeViewController ()
@property (strong, nonatomic) UIButton *someButton;
@end
Run Code Online (Sandbox Code Playgroud)我注意到在许多Apple代码中,特别是他们的Breadcrumbs示例代码,他们的许多属性都在界面中声明.这两者有区别吗?我还注意到,当声明属性时@interface
,它们会自动用下划线前缀someButton = _someButton
合成,使得合成无用.
objective-c ×10
cocoa-touch ×1
coding-style ×1
inheritance ×1
reflection ×1
self ×1
struct ×1
subclass ×1
synchronized ×1
visibility ×1