使用当前版本的Objective-C,用于声明ivars的官方标准和最佳实践是什么,使用@property和@synthesize?关于这个主题有很多帖子和资源,但大多数帖子和资源在一两年前相当陈旧.我最近学会了在类的实现中只在声明块中声明ivars,以便OOP的封装原则不被破坏,但是在这个时代甚至需要声明ivars?在做什么可能的用例:
@interface MyClass()
@property (nonatomic) NSString* data;
@end
@implementation MyClass{
@private
NSString* _data;
}
@end
Run Code Online (Sandbox Code Playgroud)
有必要的?为了进一步说明,是否有必要使用@synthesize?我的理解是使用@property将自动合成访问器方法以及支持ivars.我做了一些实验,我注意到当我没有NSString* _data', I can still access在我的类实现中声明_data'时.这是否意味着宣称伊娃将归结为一种风格问题,这取决于程序员的自由裁量权?我可以压缩我的代码并删除我的实现中的语句块中的所有ivar声明,并@property在我的私有界面中使用吗?如果不是这样,那么明确宣布伊娃的优点和缺点是什么?
最后,@dynamic.从我可以收集到的,它曾经对编译器说,"嘿编译器,不要自动生成访问器方法,如果你没有找到它的实现,不要担心,我会在运行时提供一个".这一切@dynamic都用于或者还有更多吗?
我只是想澄清所有这些事情,因为它似乎有很多不同的意见,而且没有必要一个正确的答案.此外,随着Objective-C的发展和进步,这些答案将会发生变化,因此有一个简明扼要的最新指南会很好.感谢大家!(如果有什么我可以说得更好或更清楚,请告诉我)
编辑:
总之,我问的是这个:
1)宣布具有现代Objective-C的伊娃需要吗?2)我可以通过使用来实现声明ivars和相应属性的相同效果@property吗?3)@dynamic用于什么?4)我可以完全放弃使用@synthesize或是否有一个好的用例?
在您认为合适的情况下进行投票和投票.
我正在使用核心图形绘制圆形图像,并修改了此SO答案的实现
这是我的来源:
+ (UIImage*)circularImageWithRadius:(CGFloat)radius color:(UIColor*)color{
CGRect rect = CGRectMake(0.0f, 0.0f, radius*2, radius*2);
UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(context, color.CGColor);
CGContextFillEllipseInRect(context, rect);
UIImage* image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
Run Code Online (Sandbox Code Playgroud)
边缘模糊,我不知道为什么(我认为设备的分辨率无关紧要,它可以直接使用).
我尝试替换CGContextFillEllipseInRect(context, rect);,CGContextFillRect(context, rect);这也很模糊.然后我尝试了CGContextFillRect(context, CGRectMake(0, 0, radius*4, radius*4)它完美,清晰的图像和一切(虽然是一个正方形,而不是一个圆圈).所以我改回去了,CGContextDrawEllipseInRect(context, CGRectMake(0, 0, radius*4, radius*4)但这是我的结果:

而对于矩形,它与使用半径*2时的大小相同,但图像更清晰.
如何修复模糊问题以及为什么不CGContextFillEllipseInRect填充预定义的图像rect?
我Video在React中制作了一个小组件(因为你猜对了,播放视频),我希望将该组件嵌入到父组件中,然后能够play在视频组件上调用方法.
我的视频组件如下所示:
import React, { Component, PropTypes } from 'react';
import ReactDOM from 'react-dom';
const { string, func } = PropTypes;
export default class Video extends Component {
static propTypes = {
source: string.isRequired,
type: string.isRequired,
className: string
};
play = () => {
};
render = () => {
const { className } = this.props;
return (
<video className={ className } width="0" height="0" preload="metadata">
<source src={ this.props.source } type={ this.type } />
Your browser does …Run Code Online (Sandbox Code Playgroud) 我正在为OS X开发一个免费的应用程序,它会按计划将您的计算机静音.它背后的想法是如此,如果你在一个会议或班级,你可以运行该应用程序,并确保它不会发出噪音.问题是,我不知道如何静音系统卷.有帮助吗?
我有一个iPhone应用程序,缩放到用户位置的最近城市,我希望用户能够双击userLocation注释,并让地图放大到一个块左右.
如何获取userLocation注释以识别它被点击?
我在iOSU开发的iTunesU课程中观看精彩的Paul Haggerty(因为谁不需要刷新基础知识?)他说了一些我不知道的事情:
"我们永远不会访问下划线(_符号)变量"
然后他继续讨论了如何使用@property声明变量,@synthesize variable = _variable是由编译器在幕后生成的代码,以及setter和getter.基本上,代码永远不会出现在您的应用程序中.
在我迄今为止编写的所有iOS应用程序中,我总是@property在我的头文件中声明我的变量.@synthesize VARIABLE_NAME = _VARIABLE_NAME;自从观看讲座以来,我现在很困惑我是否应该@synthesize在我的代码中使用它.
我应该只使用财产声明吗?如果我在代码中使用合成声明,它有什么区别(如果有的话)?
既然Haggerty先生不使用它,那我为什么呢?(考虑到他是一个iOS半神).我非常觉得做我一直在做的事情是不好的形式.
有人关心澄清这个问题吗?
我有这个非常有趣的webpack问题,我无法理解为我的生活.
我有像这样的标准font-face声明:
// MarkOT-ExtraLight
@font-face {
font-family: 'MarkOT-ExtraLight';
src: require('MarkOT-ExtraLight.eot?#iefix') format('embedded-opentype'),
require('MarkOT-ExtraLight.otf') format('opentype'),
require('MarkOT-ExtraLight.woff') format('woff'),
require('MarkOT-ExtraLight.ttf') format('truetype'),
require('MarkOT-ExtraLight.svg#MarkOT-ExtraLight') format('svg');
font-weight: normal;
font-style: normal;
}
Run Code Online (Sandbox Code Playgroud)
```
现在我注意到使用require工作正常,除了我的手机上没有加载任何字体.所以我转而require去看看url,这一切都奏效了.
我将我的应用程序部署到heroku,直到我访问我的网站时才发现我的css文件已经发展到57.3 MB了2.8 MB.是的,你听到了,57.3 MB.我通过require在我的font-face声明中使用切换到使用url以确认实际发生的情况来测试它三次.
有没有人经历过类似的事情?我在下面包含了我的webpack配置.
var webpack = require('webpack');
var path = require('path');
var HtmlWebpackPlugin = require('html-webpack-plugin');
var BrowserSyncPlugin = require('browser-sync-webpack-plugin');
var ExtractTextPlugin = require('extract-text-webpack-plugin');
//Environment constants
const DEVELOPMENT = "development";
const PRODUCTION = "production";
// Functions for …Run Code Online (Sandbox Code Playgroud) 鉴于我有rootViewControllerwhich is UIApplication.shared.delegate?.window??.rootViewController,我想获取活动导航控制器(如果有)。
到目前为止,我想出了:
guard var controller = rootViewController?.presentedViewController else { return rootViewController as? UINavigationController }
while let presented = controller.presentedViewController {
controller = presented
}
controller = controller.navigationController ?? controller
return controller as? UINavigationController
Run Code Online (Sandbox Code Playgroud)
这足够了吗?一个共同工作给了我这个解决方案,但我不明白的部分是rootViewController?.presentedViewController. 不应该rootViewController?.presentingViewController吗?
我正在制作一个Web应用程序模糊器,对于我的代理服务器,我正在使用由一个名叫Alex Ott的人开发的开源代码(现在).我注意到,当我从一些网站发出请求时,我们确实想用C++编写自己的代理,但我完全不知道从哪里开始.有人可以向我解释一下吗?
最终目标是能够捕获并将通过代理发出的每个请求写入文件,我已经在做了,但我现在拥有的代理服务器并没有捕获所有这些请求,我知道在那里.
编辑:由于问题不清楚,这里是:我想知道使用Boost扩展库用C++编写的代理服务器的代码是什么.过去四个月的同样问题.
做NSLog(@"%p", &object);和 有NSLog(@"%p", object);什么区别?
两者似乎都打印出一个内存地址,但我不确定哪个是对象的实际内存地址。
我有以下嵌套结构:
public struct Session {
public enum Type: Int {
FirstLaunch = 0, NotRegistered, LoggedOut, LoggedIn
}
}
Run Code Online (Sandbox Code Playgroud)
它非常简单,非常准确.但是,当我尝试访问时FirstLaunch,例如,Xcode会引发以下错误:
'Session.Type.Type' does not have a member named 'FirstLaunch'
Run Code Online (Sandbox Code Playgroud)
任何人都知道发生了什么事吗?
ios ×4
objective-c ×4
swift ×2
audio ×1
boost ×1
c ×1
c++ ×1
css ×1
ecmascript-6 ×1
fonts ×1
heroku ×1
html5 ×1
javascript ×1
macos ×1
mkannotation ×1
mkmapview ×1
oop ×1
proxy ×1
reactjs ×1
sass ×1
userlocation ×1
webpack ×1